关于JSCH上传文件到sftp服务器时 [session.connect()] 连接sftp服务器慢的问题 您所在的位置:网站首页 创建SSH session失败 关于JSCH上传文件到sftp服务器时 [session.connect()] 连接sftp服务器慢的问题

关于JSCH上传文件到sftp服务器时 [session.connect()] 连接sftp服务器慢的问题

2023-09-18 13:52| 来源: 网络整理| 查看: 265

Session session = null; try { // 创建JSch对象 JSch jsch = new JSch(); // 根据用户名,主机ip,端口获取一个Session对象 session = jsch.getSession(username, hostname, port); if(session==null) { System.out.println("-----"); } // 设置密码 session.setPassword(password); Properties configTemp = new Properties(); configTemp.put("StrictHostKeyChecking", "no"); // 为Session对象设置properties session.setConfig(configTemp); // 设置timeout时间 session.setTimeout(60000); System.out.println("======="); // 关闭认证 // session.setConfig("PreferredAuthentications","password"); //session.setConfig("PreferredAuthentications", "password,gssapi-with-mic,publickey,keyboard-interactive"); session.connect(); System.out.println("--------"); } catch (JSchException e) { }

每次调用方法到session.connect()时会卡很久。

Linux 输入命令 strace ssh [email protected],查看卡住位置,可以看到查询/etc/hosts,然后打开了一个socket,取查询192.168.1.5,这个是我在/etc/resolv.conf里面设置的DNS,因此卡在了sendto函数,一直无法查询到结果。

open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 4 fstat(4, {st_mode=S_IFREG|0644, st_size=186, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f95a2d2d000 read(4, "127.0.0.1 localhost localhost."..., 4096) = 186 read(4, "", 4096) = 0 close(4) = 0 munmap(0x7f95a2d2d000, 4096) = 0 socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4 connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.5")}, 16) = 0 gettimeofday({1561445066, 150842}, NULL) = 0 poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}]) sendto(4, "\352\23\1\0\0\1\0\0\0\0\0\0\00213\00218\0011\00210\7in-addr\4"..., 41, MSG_NOSIGNAL, NULL, 0) = 41 poll([{fd=4, events=POLLIN}], 1, 5000) = 0 (Timeout) gettimeofday({1561445071, 154888}, NULL) = 0 poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}]) sendto(4, "\352\23\1\0\0\1\0\0\0\0\0\0\00213\00218\0011\00210\7in-addr\4"..., 41, MSG_NOSIGNAL, NULL, 0) = 41 poll([{fd=4, events=POLLIN}], 1, 5000) = 0 (Timeout) close(4) = 0

因此,问题原因都指向了DNS查询。然而为什么ssh用的是IP而不是域名,还会导致缓慢呢,原因在于:

OpenSSH在用户登录的时候会验证IP,它根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法。如果客户机的IP没有域名,或者DNS服务器很慢或不通,那么登录就会很花时间。

现在问题比较明确了,解决方法如下:

方案一:直接改善DNS查询 [亲测可用]

将ssh要访问的IP地址与域名添加到 /etc/hosts中,加速查询

输入命令 vim /etc/resolv.conf

# Generated by NetworkManager domain localdomain search localdomain nameserver 192.16*.***.*** [改成自己的ip]

3、检查/etc/nsswitch.conf 文件,确保有hosts: files dns行,代表查询主机会首先查询files(/etc/hosts) ,然后查询DNS(/etc/resolv.conf)。

问题: 重启后发现/etc/resolv.conf又恢复到原来的状态

原因: 直接修改/etc/resolv.conf这个文件是没用的,网络服务重启以后会根据 /etc/sysconfig /network-scripts/ifcfg-eth0来重载配置,如果ifcfg-eth0没有配置DNS,那么resolv.conf会被冲掉,重新变成空值。

解决方法: vim /etc/sysconfig/network-scripts/ifcfg-eth0 在配置下加入下面的内容

DNS1=192.16*.***.***(默认的ip) DNS2=192.16*.***.***(自己的ip)

结果: 这样设置后,/etc/resolv.conf里面根本就不需要设置。service network restart 后,可以发现/etc/resolv.conf里面就有两个dns的解析ip了。配置好以后重启网络,cat /etc/resolv.conf,可以看到如下参数:

nameserver 192.16*.***.*** nameserver 192.16*.***.***

DNS解析设置成功。

方案二:改善ssh服务 [我用这个不行]

1、查看ssh 客户端配置文件/etc/ssh/ssh_config(注意不是sshd_config),修改host:GSSAPIAuthentication no,不使用GSSAPI来鉴权。

2、修改sshd_config 添加行UseDNS no关闭ssh的dns查询,然后重启sshd



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有